Cteni ze serioveho portu
Otázka od: Viktor Marek
11. 7. 2004 14:19
Zdravim
Ze serioveho portu na kterem je pripojeno zarizeni vycitam hodnoty pomoci
komponenty AsyncFree.
Na Formu mam AfComPort1 a AfTerminal1 ve kterem se mi prubezne zobrazuji
ctene hodnoty ve tvaru:
1;x;xxxx;xxx;xxx;xxxx
2;x;xxxx;xxx;xxx;xxxx
3;x;xxxx;xxx;xxx;xxxx
4;x;xxxx;xxx;xxx;xxxx
1;x;xxxx;xxx;xxx;xxxx
2;x;xxxx;xxx;xxx;xxxx
3;x;xxxx;xxx;xxx;xxxx
4;x;xxxx;xxx;xxx;xxxx
.
.
kde x jsou jednotlive hodnoty
procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
begin
cti:=AfComPort1.ReadString;
AfTerminal1.WriteString(AfComPort1.ReadString);
end;
Jak dostat jednotlive radky do promene, abych je mohlo rozparsovat a hodnoty
zobrazovat treba v Labelu.
Diky za radu
Viktor Marek
viktor@vol.cz
Odpovedá: Jan Novak
11. 7. 2004 22:26
> cti:=AfComPort1.ReadString;
> AfTerminal1.WriteString(AfComPort1.ReadString);
Bozemuj! Kdyz to jednou vyctes do promenne 'cti', tak do terminalu uz
nebude co vzit, leda by mezitim prisel dalsi byte.
> Jak dostat jednotlive radky do promene
cti := cti + AfComPort1.ReadString;
repeat // vyhledame cele radky
begin
n := Pos(#13, cti); // prvni konec radku zleva
if n>0 then
begin
radek := Copy(cti,1,n-1); // extrahujeme prvni radek
cti := Copy(cti, n+1, Length(cti)); // usekneme zacatek 'cti'
Zpracuj(radek);
end;
end until n=0; // opakujem, dokud tam nejaky CR byl
To 'cti' samozrejme nesmi byt lokalni v OnDataRecived. Ja jeste po
prijeti kazdeho byte nakopavam timer, resp nastavim do nejakeho
pocitadla pocet ms do timeoutu a pri OnTimer jej snizuju o
Timer.Interval, po vyprseni ten zbytek v 'cti' zkusim taky zpracovat
anebo jej alespon zrusim.
V tom zpracovani se vyhni Application.ProcessMessages, jinak hrozi
rekurzivni zavolani a nevim, nevim, jako by ta promenna 'cti'
dopadla...